9. Docker 용어집 및 구성 요소

용어 정리

1. Daemon (데몬)

정의:

어원:

특징:

일반 프로그램:
사용자 실행 → 작업 수행 → 종료

데몬 프로세스:
시스템 시작 → 백그라운드 실행 → 요청 대기 → 처리 → 계속 실행

예시:

확인 방법:

# 실행 중인 데몬 확인
$ ps aux | grep dockerd
root  1234  0.5  1.2  dockerd

# 데몬 상태 확인
$ systemctl status docker
● docker.service - Docker Application Container Engine
   Active: active (running)

명명 규칙:


2. Driver (드라이버)

정의:

계층 구조:

┌────────────────────────┐
│   애플리케이션           │
├────────────────────────┤
│   드라이버 인터페이스    │  ← 표준화된 API
├────────────────────────┤
│   드라이버 구현체        │  ← 실제 동작
│   (A, B, C 중 선택)     │
├────────────────────────┤
│   하드웨어/시스템        │
└────────────────────────┘

Docker에서의 드라이버:

  1. Storage Driver (스토리지 드라이버)

    • 역할: 레이어 관리 및 파일시스템 구성
    • 종류: overlay2, overlayfs, devicemapper, btrfs
    • 선택 기준: OS, 파일시스템, 성능 요구사항
  2. Network Driver (네트워크 드라이버)

    • 역할: 컨테이너 네트워킹 구현
    • 종류: bridge, host, overlay, macvlan, none
    • 선택 기준: 단일 호스트 vs 다중 호스트
  3. Volume Driver (볼륨 드라이버)

    • 역할: 영속적 데이터 저장소 관리
    • 종류: local, nfs, cifs, cloud storage
    • 선택 기준: 저장소 위치, 공유 필요성

장점:

예시:

# 현재 사용 중인 스토리지 드라이버 확인
$ docker info | grep "Storage Driver"
Storage Driver: overlay2

# 네트워크 드라이버 확인
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
abc123...      bridge    bridge    local
def456...      host      host      local

3. Component (컴포넌트)

정의:

특징:

Docker의 주요 컴포넌트:

Docker Engine (전체 시스템)
├─ Docker CLI (사용자 인터페이스 컴포넌트)
├─ Docker Daemon (관리 컴포넌트)
│  ├─ Image Manager (이미지 관리 컴포넌트)
│  ├─ Container Manager (컨테이너 관리 컴포넌트)
│  ├─ Network Manager (네트워크 관리 컴포넌트)
│  └─ Volume Manager (볼륨 관리 컴포넌트)
├─ containerd (컨테이너 런타임 컴포넌트)
└─ runc (OCI 런타임 컴포넌트)

컴포넌트 간 통신:

CLI ←(REST API)→ Daemon ←(gRPC)→ containerd ←(OCI Spec)→ runc

4. Engine (엔진)

정의:

Docker Engine:

Docker Engine = dockerd + containerd + runc + CLI + 부가 기능

다른 엔진 예시:

Engine vs Component:

구분 Engine Component
범위 전체 시스템 부분 기능
독립성 독립 실행 가능 다른 컴포넌트 필요
예시 Docker Engine Docker Daemon

5. Runtime (런타임)

정의:

두 가지 의미:

1) 실행 환경 (Runtime Environment)

Python 프로그램 실행:
Python 런타임 = Python 인터프리터 + 표준 라이브러리

Java 프로그램 실행:
JRE (Java Runtime Environment) = JVM + 라이브러리

2) 실행 시점 (Runtime vs Compile Time)

Compile Time: 코드 작성 → 컴파일 (빌드 타임)
Runtime: 프로그램 실행 중 (실행 타임)

예: 런타임 에러 = 실행 중에 발생하는 에러

Docker의 런타임:

  1. 고수준 런타임 (containerd)

    • 컨테이너 생명주기 관리
    • 이미지 관리
    • 추상화 레벨 높음
  2. 저수준 런타임 (runc)

    • 실제 컨테이너 생성
    • Linux 커널 기능 직접 호출
    • OCI 표준 구현

비유:

고수준 런타임 (containerd):
"이 설계도로 집을 지어줘"

저수준 런타임 (runc):
"시멘트 붓고, 벽돌 쌓고, 지붕 올리기"

6. API (Application Programming Interface)

정의:

비유:

레스토랑 비유:
- 메뉴판 = API (어떤 기능이 있는지 명세)
- 주문 = API 호출
- 주방 = 내부 구현 (고객은 몰라도 됨)

Docker API:

HTTP 기반 REST API:

GET /containers/json     → 컨테이너 목록
POST /containers/create  → 컨테이너 생성
POST /containers/{id}/start → 컨테이너 시작
DELETE /containers/{id}  → 컨테이너 삭제

API 종류:


7. Client-Server (클라이언트-서버)

정의:

구조:

┌──────────┐           ┌──────────┐
│  Client  │  요청→    │  Server  │
│          │  ←응답    │          │
└──────────┘           └──────────┘

Docker의 Client-Server:

Docker CLI (Client)
    ↓ "컨테이너 실행해줘"
Docker Daemon (Server)
    ↓ "알겠습니다, 실행했습니다"
Docker CLI (Client)

특징:


8. Manager (매니저)

정의:

Docker의 Manager:

Docker Daemon 내부:
┌──────────────────┐
│  Image Manager   │ → 이미지 관리
├──────────────────┤
│ Container Mgr    │ → 컨테이너 관리
├──────────────────┤
│  Network Manager │ → 네트워크 관리
├──────────────────┤
│  Volume Manager  │ → 볼륨 관리
└──────────────────┘

9. Specification (스펙, 명세)

정의:

OCI Specification (OCI 명세):

OCI Runtime Spec:
"컨테이너 런타임은 이렇게 동작해야 함"

준수하는 구현체:
- runc (OCI 참조 구현)
- gVisor (Google)
- Kata Containers (OpenStack)

→ 모두 같은 방식으로 사용 가능!

10. Interface (인터페이스)

정의:

Docker의 Interface:

Docker API Interface:
POST /containers/create
→ 내부에서 containerd를 호출하든,
  다른 방법을 쓰든 사용자는 모름

Storage Driver Interface:
CreateLayer(), ApplyDiff()...
→ overlay2든 devicemapper든
  같은 함수로 호출

용어 간 관계

Docker Engine (엔진)
  ├─ Docker Daemon (데몬 - 백그라운드 프로세스)
  │   ├─ Image Manager (매니저 - 컴포넌트)
  │   ├─ Storage Driver (드라이버 - 컴포넌트)
  │   └─ Network Driver (드라이버 - 컴포넌트)
  ├─ containerd (고수준 런타임 - 컴포넌트)
  └─ runc (저수준 런타임 - 컴포넌트)

통신:
- Docker API (인터페이스) - Client와 Server 연결
- OCI Spec (명세) - 런타임 표준 정의

Docker 구성도

전체 아키텍처

Docker 전체 구성:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┌─────────────────────────────────────────────────────────────────┐
│                          사용자 환경                              │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │              Docker CLI (docker 명령어)                   │   │
│  │  $ docker run / pull / build / ps / exec / logs ...      │   │
│  └────────────────────────┬─────────────────────────────────┘   │
└───────────────────────────┼─────────────────────────────────────┘
                            │ Docker API (REST API over HTTP/Socket)
                            ▼
┌─────────────────────────────────────────────────────────────────┐
│                       Docker Daemon (dockerd)                    │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  Image Manager        Container Manager     Network Mgr   │  │
│  │  • Pull/Push          • Create/Start/Stop   • Bridge      │  │
│  │  • Build              • Pause/Resume        • Host        │  │
│  │  • Tag/Remove         • Remove              • Overlay     │  │
│  └───────────────────────────────────────────────────────────┘  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  Volume Manager       Storage Driver        BuildKit      │  │
│  │  • Create             • overlay2/overlayfs  • 이미지 빌드  │  │
│  │  • Mount              • 레이어 관리          • 캐시 관리    │  │
│  │  • Remove             • CoW 파일시스템      • 병렬 빌드    │  │
│  └───────────────────────────────────────────────────────────┘  │
└────────────────────────────┬────────────────────────────────────┘
                             │ containerd API (gRPC)
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│                      containerd (고수준 런타임)                   │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  • 이미지 전송 및 저장                                      │  │
│  │  • 컨테이너 생명주기 관리                                   │  │
│  │  • 스냅샷 관리                                              │  │
│  │  • 네임스페이스/cgroups 인터페이스                          │  │
│  └───────────────────────────────────────────────────────────┘  │
└────────────────────────────┬────────────────────────────────────┘
                             │ OCI Runtime Spec (JSON)
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│               OCI Runtime (저수준 런타임 - runc)                  │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  Linux Kernel Features:                                   │  │
│  │  • Namespaces (PID, NET, MNT, UTS, IPC, User)            │  │
│  │  • Cgroups (CPU, Memory, I/O, Network)                   │  │
│  │  • Capabilities (권한 제한)                               │  │
│  │  • Seccomp (시스템 콜 필터링)                             │  │
│  └───────────────────────────────────────────────────────────┘  │
└────────────────────────────┬────────────────────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────────────────┐
│                    격리된 컨테이너 프로세스                        │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  • 독립된 PID 네임스페이스                                 │  │
│  │  • 독립된 네트워크 스택                                     │  │
│  │  │  • 독립된 파일시스템 (overlayfs)                        │  │
│  │  • 리소스 제한 적용 (CPU, Memory)                          │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                      Docker Registry (외부)                      │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │  Docker Hub / Private Registry                            │  │
│  │  • 이미지 저장소                                           │  │
│  │  • 레이어별 저장/전송                                       │  │
│  │  • 이미지 태그 관리                                         │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

Docker 핵심 용어

A. 기본 개념

Container (컨테이너)

Image (이미지)

Dockerfile

Registry (레지스트리)


B. 아키텍처 구성 요소

Docker Client (docker CLI)

Docker Daemon (dockerd)

containerd

runc (OCI Runtime)


C. 레이어와 스토리지

Layer (레이어)

Storage Driver (스토리지 드라이버)

Copy-on-Write (CoW)

overlayfs


D. 네트워킹

Bridge Network (브릿지 네트워크)

Host Network (호스트 네트워크)

Overlay Network (오버레이 네트워크)

Port Mapping (포트 매핑)


E. 볼륨과 스토리지

Volume (볼륨)

Bind Mount (바인드 마운트)

tmpfs Mount


F. 격리 기술 (Linux Kernel Features)

Namespace (네임스페이스)

cgroups (Control Groups)

Capabilities

Seccomp (Secure Computing Mode)


G. 빌드 관련

BuildKit

Multi-stage Build (멀티 스테이지 빌드)

Build Cache (빌드 캐시)


H. 실행 관련

Docker Compose

Entrypoint vs CMD

Health Check (헬스 체크)


I. OCI 표준

OCI (Open Container Initiative)

OCI Image Format


J. 보안

Root vs Rootless

Docker Content Trust (DCT)


용어 간 관계도

이미지 생성 및 실행 흐름:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. Dockerfile 작성
   ↓ (docker build)
2. BuildKit이 명령어 해석
   ↓
3. 레이어별로 이미지 빌드
   ↓ (Storage Driver가 레이어 저장)
4. 완성된 이미지 (여러 레이어의 스택)
   ↓ (docker push)
5. Registry에 업로드
   ↓ (docker pull)
6. 로컬에 이미지 다운로드
   ↓ (docker run)
7. Docker Daemon이 요청 받음
   ↓
8. containerd에 컨테이너 생성 요청
   ↓
9. runc가 네임스페이스/cgroups 설정
   ↓ (overlayfs로 레이어 병합)
10. 컨테이너 프로세스 실행
    ↓
11. 실행 중인 컨테이너
    • 독립된 네임스페이스
    • 제한된 리소스 (cgroups)
    • 격리된 파일시스템 (overlayfs)

핵심 정리

Docker = 표준화된 애플리케이션 패키징 및 실행 플랫폼

  1. 이미지: 읽기 전용 템플릿 (레이어의 스택)
  2. 컨테이너: 이미지로부터 생성된 실행 환경
  3. Docker Daemon: 모든 것을 관리하는 중앙 서비스
  4. OCI Runtime: 실제 격리 환경을 만드는 저수준 도구
  5. 레이어: 변경 사항의 단위, 재사용으로 효율성 확보
  6. 네임스페이스: 프로세스 격리
  7. cgroups: 리소스 제한
  8. overlayfs: 레이어를 병합하여 단일 파일시스템 제공